package come.bjpowernode.javase.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
//JUC(java.util.concurrent)包下的，属于java的并发包，老JDK中没有这个包，新特性。

/*
实现线程的第三种方式：
    实现Callable接口。

    这种方式的优点是：可以获得线程的返回结果
    这种方式的缺点是：效率较低，在获取t线程返回结果的时候，会导致当前线程阻塞。
 */

public class ThreadTest15 {
    public static void main(String[] args) throws Exception{
         //第一步：创建一个未来任务类对象
        //参数非常重要：需要给一个Callable接口实例对象
        FutureTask task = new FutureTask(new Callable(){
        //public class FutureTask<V> implements RunnableFuture<V>
            @Override
            public Object call() throws Exception {
                //call方法相当于run方法，只不过这个有返回值
                System.out.println("call method begin");
                Thread.sleep(1000*10);
                System.out.println("call method end");
                int a = 100;
                int b = 200;
                return a + b;//自动装箱，300变成integer类型
            }
        });

        //创建线程对象
        Thread t = new Thread(task);

        //启动线程
        t.start();

        //这里是main方法是主线程
        // 怎么在主线程中获取t线程的返回结果
        //get()方法会是当前线程阻塞
        Object obj = task.get();
        System.out.println("线程执行结果" + obj);
        //这以下的方法想执行必须等get()方法结束。
        //而get方法可能要等很久，因为get方法要拿另一个线程的执行结果
        System.out.println("Hello World");
    }
}
